/* 
基础数据类型
1. boolean
2. number
3. string
4. null和undefined
5. 数组
6. 元组(Tuple) 
7. 枚举(enum)
8. any
9. void
10. object
*/

(function () {
  // 1. boolean
  let isDone: boolean = false
  isDone = true
  // isDone = 'abc'  // error 不能将类型“string”分配给类型“boolean”

  // 2. number
  let age: number = 12
  // age = true // error

  // 3. string
  let name: string = 'tom'
  // name = 12  // error
  let info: string = `我叫${name}, 今年${age}`

  // 4. null和undefined    它们是任意其它类型的子类型
  let u: null = null
  // u = 'abc' // error
  let un: undefined = undefined
  // un = 123  // error
  info = null
  info = undefined
  console.log('--------')
  // 5. 数组
  const arr1: number[] = [2, 1.2, -1/* , 'abc' */]
  const arr2: Array<string> = ['abc', ''/* , 2 */]

  // 6. 元组(Tuple) 元组类型允许表示一个已知元素数量和类型的数组
  let t: [string, number]
  t = ['tom', 12]

  // 7. 枚举(enum)  使用枚举类型可以为一组数值赋予友好的名字
  enum Color {
    Red = 4,
    Yellow = 2,
    Blue
  }
  console.log(Color)
  let myColor: Color = Color.Yellow  // 2
  console.log(Color[3])

  // 8. any
  let arr3: any[] = ['abc', 1, true]
  
  // 9. void  表示没有任何类型    一般用来指定函数没有返回值
  function fn(): void {
    // return 'abc'  // error
    // return undefined 
    // return null
  }

  // 10. object 
  function fn2(): object {
    // return {}
    // return []
    // return () => {}
    // return 3 // error
    // return null
    return undefined
  }
  
  
})()

/* 

js 弱类型   声明变量不能指定类型
ts 强类型   声明变量时可以指定类型
强类型的好处:
  正确语法的提示补全  
  错误语法的错误提示
*/